Java 源码学习之java.util.Hashtable
Hashtable是Java编程中较为常用的容器类之一,在面试时常常被与HashMap作比较!
为什么要常与HashMap作比较呢?因为他们的源码是极其相似啊,网上也常常有人说HashMap是基于Hashtable实现的吧,因为Hashtable在Java1.0中就有了,但是HashMap在Java1.2才出现。
本文讲解Hashtable时不再累赘,实现的原理大致都和HashMap一样,这里主要讲Hashtable与HashMap几个不同点。
不支持null
我们知道HashMap是支持null的键和值的,每次遇到null时直接用0来作桶号,来看下Hashtable对null的处理
1 | /** |
可以很显眼的看到当value == null会抛NPE异常,那key == null源码中可没写上,其实该判断时在key.hashCode(),而Object.hashCode是不支持null的,也就自然而来得Hashtable不支持null的键和值了
线程安全
在Hashtable中的绝大部分方法都是使用synchronized进行修饰的,这一点和HashMap有较大的不同,虽然说Hashtable的方法在多线程是安全的,但是和Vector一样,在多线程下使用时也要再看是否还额外需要synchronized再修饰。
求余取桶号
在HashMap中是根据key的hash值和table.length进行与操作来求桶号的,并且要求table.length必须是2的幂次方,但是在HashMap中的实现是使用hash和table.length求余来实现,在对table.length的值并无其他要求,这种方法实现简单,但是效率没有HashMap的高,毕竟求余除法操作要比与操作慢。1
int index = (hash & 0x7FFFFFFF) % tab.length;
总结
其实要总结的都在上面说了,Hashtable与HashMap主要的几个不同就是:
Hashtable不支持null的键和值Hashtable是线程安全的Hashtable是用过求余来取桶号的
本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言。

